/* 
 * File:   Semaforo.c
 * Author: Raphael de Souza, Marcos Moresco e Rafael Atux
 *
 * Created on October 18, 2012, 11:36 PM
 */

/* 	
O semaforo guarda em uma lista os processos que estao bloqueados, ou seja, dormindo e enviando sinais de acordar 
*/
#include "semaforo.h"

// Inicializando o Semaforo - Nessa caso sempre em 1
void
init_semaforo(int semaforo, int n){
    semaforo = n; //Numero maximo de processos que podem acessar ao mesmo tempo um determinado recurso Recurso.
}

// Incrementando o Semaforo
void
incrementa_semaforo(semaforo s, list_bloqueado* l, Processo* p){
    if(s == 0 && existe_processo_bloqueado(l))// Se o semaforo estiver em 0, isso significa que nenhum processo est� com o sinal acordar pendende. Assim sendo ele pode desbloquear o processo que requisitou o semaforo.
		desbloqueia_processo(l, p);//Libera o recurso para ser acessado por algum dos processos que estavam na lista dos bloqueados
    else
		s++;// Caso contrario, o processo que requisitou o semaforo entrar na lista de processos bloqueados.
    printf("\nProcesso foi desbloqueado e conseguiu acessar o Recurso\n");
}

// Decrementando o Semaforo
void
decrementa_semaforo(semaforo s, list_bloqueado* l, Processo* p){
    if(s == 0)
		bloqueia_processo(l, p); // Envia o processo para a lista dos bloqueados
    else
		s--;
    printf("\nProcesso enviado para a Lista de Bloqueados\n");
}

//Verifica se existe algum processo bloqueado
bool
existe_processo_bloqueado(list_bloqueado* l) {
	if (l->tamanho == 0)
		return true;
	else
		return false;
}

// Desbloqueia um processo, retirando-o da lista de processos bloqueados
void
desbloqueia_processo(list_bloqueado* l, Processo* p) {
	//link node = new_no(p);
	//remove_no(l, p);
}

// Bloqueia um processo, colocando-o da lista de processos bloqueados
void
bloqueia_processo(list_bloqueado* l, Processo* p) {
	//link node = new_no(p);
	//insere_no(l, p);
}